import service from '@/api/request'
import Vue from 'vue'
import SparkMD5 from 'spark-md5'
import axios from "axios";
import {message} from "ant-design-vue";

/**
 * post请求
 * @param url
 * @param param
 * @returns {AxiosPromise}
 */
export function postAction(url,param) {
    return service({
        url: Vue.prototype.webUrl+url,
        method: 'post',
        data:param,
        headers: {
            'X-Access-Token': Vue.ls.get("ACCESS_TOKEN"),
        },
    });
}

/**
 * get请求
 * @param url
 * @param param
 * @returns {AxiosPromise}
 */
export function getAction(url, param){
    return service({
        url: Vue.prototype.webUrl+url,
        method: 'get',
        data:param,
        headers: {
            'X-Access-Token': Vue.ls.get("ACCESS_TOKEN"),
        },
    });
}

/**
 * 文件上传 用于富文本上传图片
 * 使用formData时  不能手动设置Content-Type
 * @param url
 * @param parameter
 * @returns {*}
 */
export function uploadAction(url,parameter){
    const service = axios.create({
        timeout: 5000  // 请求超时时间
    });
    service.interceptors.response.use(
        response => {  //成功请求到数据
            return response.data;
            return Promise.reject(error)
        }
    );
    return service({
        url: Vue.prototype.webUrl+url,
        data: parameter,
        method:'post' ,
    });
}

/**
 * delete方法
 * @param url
 * @param parameter
 * @returns {AxiosPromise}
 */
export function deleteAction(url,parameter) {
    // var data =  Qs.stringify(parameter);
    return service({
        url: Vue.prototype.webUrl+url,
        data: parameter,
        method:'delete' ,
        headers: {
            'X-Access-Token': Vue.ls.get("ACCESS_TOKEN"),
        },
    })
}


/**
 * 获取后台api根目录
 */
export function getApiUrl() {
    return Vue.prototype.webUrl;
};



/**
 * 根据md5获取上传进度，每获取一次进度，执行一次回调函数（传递进度值）
 * @param md5
 * @param annex
 * @param callback  参数：进度p、md5、附件对象、
 * @returns {AxiosPromise}
 */
export function uploadFile(file,annex,callback) {
    if(callback)callback(0,null,null);
    getFileMD5(file,function(md5){
        if(callback)callback(0,md5,{});
        postAction('fastdfs/annex/isMd5',{"md5":md5}).then(res=>{
            if(!res.isMd5) {//需要上传
                let forms = new window.FormData();
                forms.append('file', file);
                forms.append('md5', md5);
                forms.append('tableId', annex.tableId);
                forms.append('workCode', annex.workCode);
                forms.append('objName', annex.objName);
                uploadAction('fdfs/breakpointUpload', forms).then(o => {
                    uploadProceed(md5,function(p){
                        if(callback)callback(p,md5,o.data);
                    });
                    console.log("上传成功！",o);
                }).catch(err => {
                })
            }else{//秒传
                postAction('fastdfs/annex/saveAnnex',{
                    "md5":md5,
                    "workCode":annex.workCode,
                    "objName":annex.objName,
                    "filename":file.name,
                    "tableId":annex.tableId
                }).then(o=>{
                    if(callback)callback(100,md5,o.data);
                    console.log("秒传成功！",res);
                })
            }
        })
    })
}





/**
 * 根据md5获取上传进度，每获取一次进度，执行一次回调函数（传递进度值）
 * @param md5
 * @param callback
 * @returns {AxiosPromise}
 */
export function uploadProceed(md5,callback) {
    let time=0;
    function getProceed(){
        service({
            url: Vue.prototype.webUrl+"fdfs/progress?md5="+md5,
            method:'get' ,
            headers: {
                'X-Access-Token': Vue.ls.get("ACCESS_TOKEN"),
            },
        }).then(res=>{
            if(!res.data&&time>60*1000){//一分钟内依然没有任何进度，则取消获取
               return;
            }
            if(res.data!=100){
                callback(res.data);
                setTimeout(getProceed, 400);
                time+=400;
            }

            if(res.data==100)callback(res.data);
        })
    }
    getProceed();
}

/**
 * 获取文件md5
 * @param file
 * @param callback
 */
export function getFileMD5(file,callback){
        //声明必要的变量
        var fileReader = new FileReader(),

        //文件每块分割2M，计算分割详情
        chunkSize = 2097152,
        chunks = Math.ceil(file.size / chunkSize),
        currentChunk = 0,

        //创建md5对象（基于SparkMD5）
        spark = new SparkMD5()

        //每块文件读取完毕之后的处理
        fileReader.onload = function(e) {
            //每块交由sparkMD5进行计算
            spark.appendBinary(e.target.result)
            currentChunk++

            //如果文件处理完成计算MD5，如果还有分片继续处理
            if (currentChunk < chunks) {
                loadNext();
            } else {
                callback(spark.end());
            }
        }

        //处理单片文件的上传
        function loadNext() {
            var start = currentChunk * chunkSize,
                end = start + chunkSize >= file.size ? file.size : start + chunkSize
            fileReader.readAsBinaryString(file.slice(start, end))
        }

        loadNext()
}

/**
 * 格式化文件大小, 输出成带单位的字符串
 * @method formatSize
 * @grammar formatSize( size ) => String
 * @grammar formatSize( size, pointLength ) => String
 * @grammar formatSize( size, pointLength, units ) => String
 * @param {Number} size 文件大小
 * @param {Number} [pointLength=2] 精确到的小数点数。
 * @param {Array} [units=[ 'B', 'K', 'M', 'G', 'TB' ]] 单位数组。从字节，到千字节，一直往上指定。如果单位数组里面只指定了到了K(千字节)，同时文件大小大于M, 此方法的输出将还是显示成多少K.
 * @example
 * console.log( formatSize( 100 ) );    // => 100B
 * console.log( formatSize( 1024 ) );    // => 1.00K
 * console.log( formatSize( 1024, 0 ) );    // => 1K
 * console.log( formatSize( 1024 * 1024 ) );    // => 1.00M
 * console.log( formatSize( 1024 * 1024 * 1024 ) );    // => 1.00G
 * console.log( formatSize( 1024 * 1024 * 1024, 0, ['B', 'KB', 'MB'] ) );    // => 1024MB
 */
export function formatSize(size, pointLength, units) {
    let unit;
    units = units || [ 'B', 'K', 'M', 'G', 'TB' ];
    while ((unit = units.shift()) && size > 1024) {
        size = size / 1024;
    }
    return (unit === 'B' ? size : size.toFixed(pointLength || 2))
        + unit;
};


/**
 * 获取附件文件类型的图标
 * @param p 附件url 或扩展名
 * @param ext
 * @returns {*}
 */
export function getFileIcon(p) {
    let maps = {
        "rar":"icon_rar.gif",
        "zip":"icon_rar.gif",
        "tar":"icon_rar.gif",
        "gz":"icon_rar.gif",
        "bz2":"icon_rar.gif",
        "doc":"icon_doc.gif",
        "docx":"icon_doc.gif",
        "pdf":"icon_pdf.gif",
        "mp3":"icon_mp3.gif",
        "xls":"icon_xls.gif",
        "chm":"icon_chm.gif",
        "ppt":"icon_ppt.gif",
        "pptx":"icon_ppt.gif",
        "avi":"icon_mv.gif",
        "rmvb":"icon_mv.gif",
        "wmv":"icon_mv.gif",
        "flv":"icon_mv.gif",
        "swf":"icon_mv.gif",
        "rm":"icon_mv.gif",
        "exe":"icon_exe.gif",
        "psd":"icon_psd.gif",
        "txt":"icon_txt.gif",
        "jpg":"icon_jpg.gif",
        "png":"icon_jpg.gif",
        "jpeg":"icon_jpg.gif",
        "gif":"icon_jpg.gif",
        "ico":"icon_jpg.gif",
        "bmp":"icon_jpg.gif"
    };

    let fileType="icon_default.png";
    if(p.indexOf(".")!=-1){
        p = url.substr(url.lastIndexOf('.') + 1).toLowerCase();
    }

    fileType=maps[p]?maps[p]:"icon_default.png";
    return  "fileTypeImages/"+fileType;
};

/**
 * 获取附件文件类型的图标
 * @param p 附件url 或扩展名
 * @param ext
 * @returns {*}
 */
export function download(url,fileName) {
    let link = document.createElement('a')
    // 这里是将url转成blob地址，
    fetch(url).then(res => res.blob()).then(blob => { // 将链接地址字符内容转变成blob地址
        link.href = URL.createObjectURL(blob)
        link.download = fileName?fileName:'';
        document.body.appendChild(link)
        link.click()
    })
}